home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1997 August / Macworld (1997-08).dmg / Shareware World / Info / For Developers / InstallerMaker™ 4.0 Installer / Customizing InstallerMaker / Sample Code / Utilities / PackStrParser.c < prev    next >
Text File  |  1995-08-03  |  6KB  |  169 lines

  1. /******************************************************************************
  2. **
  3. **  Project Name:    InstallerMaker 3.0 Demo Code
  4. **     File Name:    PackStrParser.c
  5. **
  6. **   Description:    This routine can parse a comma delimited string listing
  7. **                    InstallerMaker 3.0 package bits.
  8. **                     
  9. **        Packages field
  10. **        ==============
  11. **        
  12. **        The interpretation of packages for the code rsrcs is:
  13. **        
  14. **        IM 2.0: packages should be interpreted as a 16 bit field. 
  15. **            Bit 0 is the lowest bit.
  16. **        
  17. **        IM 3.0: packages should be interpreted as a 128 bit field. 
  18. **            packages[0] contains bits 0-31 where 0 is the lowest bit. 
  19. **            packages[1] contains bits 32-63 where 32 is the lowest bit.
  20. **             Similarly for packages[2] and packages[3].
  21. **        
  22. **        packages is a bit mask where bit 0 set means std pkg, bit 1
  23. **            set means pkg A, bit 2 means B, etc.  For compatibility, a
  24. **            value of zero is synonymous with all ones.
  25. **            
  26. **        The packages field typically specifies the currently selected
  27. **            pkgs unless otherwise noted.
  28. **        
  29. **
  30. **   Copyright© 1994-1995 Aladdin Systems, inc.
  31. **
  32. *******************************************************************************
  33. **                      L E G A L   N I C E T I E S
  34. *******************************************************************************
  35.  
  36.     This source code is (c) 1995 Aladdin Systems, Inc.  You are free to use it 
  37.     in connection with your own products and distribute it in either source code 
  38.     or object code form.  However, this source code and accompanying written 
  39.     materials (including instructions for use) are provided "as is" without 
  40.     warranty of any kind.  Further, Aladdin Systems does not warrant, or make 
  41.     representations regarding the use, or the results of the use, of the source 
  42.     code or written materials in terms of correctness, accuracy, reliability, 
  43.     currentness, or otherwise.  No oral or written information or advice given 
  44.     by Aladdin Systems or its employees shall create a warranty, and you may not 
  45.     rely on such information or advice.
  46.     
  47.     Neither Aladdin Systems nor anyone else who has been involved with the 
  48.     creation, production, or delivery of the source code shall be liable for 
  49.     any direct, indirect, consequential, or incidental damages (including damages 
  50.     for loss of business profits, business interruption, loss of business 
  51.     information, and the like) arising out of the use or the inability to use the 
  52.     source code even if Aladdin Systems has been advised of the possibility of 
  53.     such damages.  Because some states do not allow the exclusion or limitation 
  54.     of liability for consequential or incidental damages or the limitations of 
  55.     duration of implied warranty, the above limitations may not apply to you.
  56.  
  57. *******************************************************************************
  58. **                       A U T H O R   I D E N T I T Y
  59. *******************************************************************************
  60. **
  61. **    Initials    Name
  62. **    --------    -----------------------------------------------
  63. **    RMT            Robert Thorne
  64. **
  65. *******************************************************************************
  66. **                      R E V I S I O N   H I S T O R Y
  67. *******************************************************************************
  68. **
  69. **      Date        Time    Author    Description
  70. **    --------    -----    ------    ---------------------------------------------
  71. **    08/03/95            RMT        Adapted from our test libraries.
  72. **
  73. ******************************************************************************/
  74.  
  75. #include "IMPackages256.h"
  76.  
  77. // Obligatory string copy utility
  78. static unsigned char *pStrcpy(unsigned char *dest, unsigned char *src) ;
  79.  
  80.  
  81. // Implementation
  82.  
  83. static unsigned char *pStrcpy(unsigned char *dest, unsigned char *src)
  84. {
  85.     BlockMoveData(src, dest, (long) *src + 1); 
  86.     return (dest);
  87. }
  88.  
  89.  
  90. Boolean ParsePackageString ( unsigned long *packages, Str255 packageStr )
  91. {
  92.     Str255            upperStr ;
  93.     Str31            thisPack ;
  94.     short            index , packSize, len, packNo ;
  95.     Boolean            good = true ;
  96.     unsigned char    c ;
  97.     
  98.     (void) pStrcpy ( upperStr, packageStr ) ;
  99.     UprString ( upperStr, true ) ; // diacrits are syntax errors, so let them through
  100.     
  101.     // Strategy here is to walk through the string, ignoring space characters. I
  102.     // assume that our list is comma delimited. I also assume that the longest possible
  103.     // package has 3 letters (for Std).
  104.     
  105.     // I'm also assuming that the package bit string is correctly initialized to a string
  106.     // of "1"s
  107.     
  108.     len = upperStr [0] ;
  109.     index = 1 ;
  110.     packSize = 0 ;
  111.     
  112.     while ( good && index <= len )
  113.     {
  114.         c = upperStr [index++] ;
  115.         
  116.         switch (c)
  117.         {
  118.             
  119.             case ',':
  120.                 if (packSize > 0 && packSize < 4) // valid size of package
  121.                 {
  122.                     thisPack [0] = packSize ;
  123.                     packNo = GetPackageNumber (thisPack) ;
  124.                     
  125.                     if ( packNo == -1 )
  126.                         good = false ; // bail
  127.                     else
  128.                     {
  129.                         SetPackageBit ( packages, packNo, true ) ; // set its bit
  130.                         packSize = 0 ; // reset for next package
  131.                     }
  132.                 }
  133.                 else
  134.                     good = false ;
  135.                 break ;
  136.                 
  137.             case ' ': // space character
  138.                 break ;
  139.                 
  140.             default: // Add the charater to the current package
  141.                 packSize++ ;
  142.                 thisPack [packSize] = c ;
  143.                 break ;
  144.         }
  145.     }
  146.     
  147.     // If we're still good, process any output at the end of the string
  148.     if ( good )
  149.     {
  150.         if ( packSize > 0 && packSize < 4 )
  151.         {
  152.             thisPack [0] = packSize ;
  153.             packNo = GetPackageNumber (thisPack) ;
  154.             
  155.             if ( packNo == -1 )
  156.                 good = false ; // bail
  157.             else
  158.             {
  159.                 SetPackageBit ( packages, packNo, true ) ; // set its bit
  160.                 packSize = 0 ; // reset for next package
  161.             }
  162.         }
  163.         else
  164.             good = false ;
  165.     }
  166.     
  167.     return good ;
  168.     
  169. }